#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;

//T称为模板参数，此时也是类型参数
//可以实例化成各种具体的类型
template <class T>
T add(T x,T y){
    return x + y;
}

//编译阶段
//在使用函数模板时，会根据传入的参数
//去实例化出相应的模板函数
//所以，也可以将模板视为是代码生成器
#if 0
int add(int x,int y){
    return x + y;
}

double add(double x, double y)
{
    return x + y;
}

string add(string x, string y)
{
    return x + y;
}
#endif


void test0(){
    int a1 = 2, a2 = 4;
    double b1 = 2.7, b2 = 4.6;
    string s1("hello");
    string s2(",world");

    cout << add(a1,a2) << endl;
    cout << add(b1,b2) << endl;
    cout << add(s1,s2) << endl;

    /* add(a1,b2); */
}

int main(void){
    test0();
    return 0;
}
